package com.myspringboot.workerpool.service.impl;

import org.springframework.scheduling.annotation.Async;
import com.myspringboot.workerpool.service.WorkPoolEntry;
import com.myspringboot.workerpool.callback.WorkCallBackInterface;
import org.springframework.stereotype.Service;

/**
 *
 * @author guohuixin
 * @date 2017/12/14
 * 注解@Service 与 @Repository("WorkPoolEntry") 作用一样，这是所用的层面不一样而已
 * 注解@Service用于标注业务层组件
 * 注解@Controller用于标注控制层组件（如struts中的action）
 * 注解@Repository用于标注数据访问组件，即DAO组件
 * 注解@Component泛指组件，当组件不好归类的时候，我们可以使用这个注解进行标注
 */
@Service
public class WorkPoolEntryImpl implements WorkPoolEntry {

    WorkCallBackInterface callBack;

    @Override
    public void setCallBack(WorkCallBackInterface callBack) {
        this.callBack = callBack;
    }

    @Override
    //此设置为，此任务放在哪个线程池去执行
    @Async("com.mysrpingboot.taskPool")
    /**
     * 启动第一个参数为放入线程池的任务名称；第二个参数为对应任务所需要的参数；也就是这两接口是一起使用的
     * 通过setCallBack传入放入线程池中具体任务的方法名称（此方法必须是实现了WorkCallBackInterface这个接口中的task方法）
     * 通过launchTask可以设置放入线程池中的任务名称，以及匹配任务所需要的参数；
     */
    public void launchTask(String taskName, Object object) {
        if (this.callBack != null){
            this.callBack.task(object);
        }
    }
}
